/*******************************************************************************
 * Includes
 ******************************************************************************/
#include "Wed_framework_config.h"
#include "Wed_common.h"
#include "mem/Wed_mem.h"
#include "dev/Wed_dev.h"
#include "dev/gpio/Wed_gpio.h"
#include "kernel/Wed_kernel.h"
#include "print/Wed_print.h"
#include "net/netdev/Wed_netdev.h"
#include "net/sal_socket/include/Wed_sal_socket.h"

/*******************************************************************************
 * Statement
 ******************************************************************************/
struct Wed_init {
    int  (*p_fn_init)(void);
    int    is_quit;
};

/*******************************************************************************
 * External
 ******************************************************************************/
extern int Wed_plat_board_init(void);

/*******************************************************************************
 * Static
 ******************************************************************************/
static struct Wed_init __g_init[] = {
#if WED_MEM_DYMANICS
        /* 动态内存初始化 */
        {Wed_mem_init,                    1},
#endif
        /* 设备链表初始化 */
        {Wed_dev_list_init,               1},
        /* 内核初始化 */
        {Wed_kernel_init,                 1},
        /* 平台板卡初始化 */
        {Wed_plat_board_init,             1},
#if WED_PRINT_EN
        /* 打印初始化 */
        {Wed_print_init,                  0},
#endif
        {Wed_sal_socket_init,             0},
        /* GPIO 初始化 */
        {Wed_gpio_init_all,               0},
        /* 网络设备初始化 */
        {Wed_netdev_init_all,             0},
        /* 应用线程初始化 */
        {Wed_kernel_app_init,             1},
};


/*******************************************************************************
 * Code
 ******************************************************************************/
/**
 * \brief 框架初始化函数
 *
 * @return 成功返回 0
 */
int Wed_framework_init(void){
    int ret, i, num = WED_NELEMENTS(__g_init);

    for (i = 0; i < num; i++) {
        ret = __g_init[i].p_fn_init();
        if (ret != 0) {
            if (__g_init[i].is_quit) {
                return ret;
            }
        }
    }
    /* 调度启动 */
    return Wed_kernel_scheduler_start();
}


